package org.example.controller;

import com.alibaba.fastjson.JSONObject;
import org.example.domain.WechartTokenDto;
import org.example.domain.WechartUserInfoDto;
import org.example.utils.AjaxResult;
import org.example.domain.WechartProperties;
import org.example.utils.AjaxResult;
import org.example.utils.HttpUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.UUID;

@Controller//特点注意：与微信交互，因为要返回页面，需要重定向，这里不能写  @RestController。理由：因为这个注解返回 的都是sjon，而不能返回页面

@RequestMapping("/wechart")

public class WechartController {


    @Autowired

    private WechartProperties wechartProperties;


    //申请微信登录

    @GetMapping("/apply")

    public String apply(){

        //https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_login&state=%s#wechat_redirect

        //生成一个唯一标识作为state

        String state = UUID.randomUUID().toString().replace("-","");

        //生成完整的授权码URL

        String authorizationCodeUrl = String.format(wechartProperties.getAuthorizationCodeUrl(), wechartProperties.getAppId(), wechartProperties.getRedirectUri(), state);
        //在这里进行重定向
        return "redirect:"+authorizationCodeUrl;


    }

    @GetMapping("/callback")
    @ResponseBody //返回json字符串
    public AjaxResult callback(String code,String state) {
        //第3步：当进入到回调这个方法时，则说明已经成功获取了 【授权码】

        //第4步：根据授权码来获取access_token令牌
        String tokenUrl = String.format(wechartProperties.getTokenUrl(), wechartProperties.getAppId(), wechartProperties.getAppSecrect(), code);

        //第5步：在后台通过授权码换取令牌的url，向微信后台发送http请求并返回token
        HttpUtil httpUtil = new HttpUtil(tokenUrl);//在创建http连接时，先把url地址传进来
        httpUtil.get();//发送了get请求
        //{"access_token":"50_U-Aqn2NqabxKCqDRpIsL2YgvLfAX5INqU72SAKTNIEtsJET-Fqtq1aDzUJIkT-EC2ew6RZYWPJvX1xkR4vJZkjXtgDh4aIUIbpIATEmhpKg", 令牌
        // "expires_in":7200,
        // "refresh_token":"50_bYE8JQcoCONSczcHkVbJGsC5oO9s7QkU96laOj5vKq-uWXcOQyyw3RVGt2xr41bPG8PNWcgQ283JKzxws1aiFz5E0ptKCVKfpBPsub6X18U",
        // "openid":"oa9wA094PPuJLen6cn6ANLUuRyso", 这个值就是当前扫码微信用户的微信号的加密值 open_id
        // "scope":"snsapi_login",
        // "unionid":"ovnCWw-V2UB_lGq0tXi7Wjtp2Izg"}
        String content = httpUtil.getContent();//获取请求后返回的结果

        //第6步：将返回的Token信息，通过Fastjson转换为一个对象
        WechartTokenDto wechartTokenDto = JSONObject.parseObject(content, WechartTokenDto.class);

        //第7步：根据令牌获取当前微信用户的用户信息
        String userinfoUrl = String.format(wechartProperties.getUserinfoUrl(), wechartTokenDto.getAccess_token(), wechartTokenDto.getOpenid());
        //根据拼接的url地址，向微信服务器，发送请求并获取用户的个人信息
        httpUtil = new HttpUtil(userinfoUrl);
        httpUtil.get();
        String userContent = httpUtil.getContent();
        WechartUserInfoDto wechartUserInfoDto = JSONObject.parseObject(userContent, WechartUserInfoDto.class);

        //在获取到微信用户信息后，接下来，就会与我们自己系统的业务进行对接

        return AjaxResult.success("获取成功");
    }


}